package com.iqiao.common.base;

import com.iqiao.common.base.db.BaseMyBatisDao;
import com.iqiao.common.util.date.ContextUtil;

import java.io.Serializable;
import java.util.*;

/**
 * Created by flt on 2017/11/6.
 */
public abstract class BaseDao<E, PK extends Serializable> extends BaseMyBatisDao {


    public abstract Class getEntityClass();

    /**
     * 获取mapper的命名空间
     * @return
     */
    public String getMapperNamespace() {
        return getEntityClass().getName();
    }

    /**
     * 根据主键取得对象。
     */
    public E findById(PK primaryKey) {
        return getSqlSessionTemplate().selectOne(getMapperNamespace() + ".findById", primaryKey);
    }

    /**
     * 返回一条数据对象。
     * @param sqlKey  <a href="#Mapper键值ID">Mapper键值ID</a>。
     * @param params 参数为单个对象或Map类型
     * @return
     */
    public E getUnique(String sqlKey, Object params) {
        return getSqlSessionTemplate().selectOne(getMapperNamespace() + "." + sqlKey,params);
    }

    /**
     * 返回单条数据，如 select count(*) from table_a
     * @param sqlKey
     * @param params
     * @return
     */
    public Object getOne(String sqlKey, Object params) {
        return getSqlSessionTemplate().selectOne(getMapperNamespace() + "." + sqlKey, params);
    }

    public List<E> findList(String sqlKey) {
        return getSqlSessionTemplate().selectList(getMapperNamespace() + "." + sqlKey);
    }

    public List<E> findList(String sqlKey, Object prams) {
        return getSqlSessionTemplate().selectList(getMapperNamespace() + "." + sqlKey, prams);
    }

    /**
     * 返回查询结果是否存在
     * @param params
     * @return
     */
    public boolean exist(Object params) {
         return getSqlSessionTemplate().selectOne(getMapperNamespace() + ".exist", params);
    }

    public List<E> findAll() {
        return findAll(null);
    }

    /**
     * 返回所有数据
     * @param params
     * @return
     */
    public List<E> findAll(Object params) {
        return getSqlSessionTemplate().selectList(getMapperNamespace() + ".findAll", params);
    }

    public int getCount(Object params) {
        return (int) this.getOne("getCount", params);
    }

    /**
     * 分页查询
     * @param params
     * @return
     */
    public List<E> findPage(Object params) {
        if (params == null) params = new HashMap<>();
        return getSqlSessionTemplate().selectList(getMapperNamespace() + ".findPage", params);
    }

    /**
     * 分页查询
     * @param params
     * @return
     */
    public List<E> findPage(int pageNo, int pageSize, Map<String, Object> params) {
        if (params == null) params = new HashMap<>();
        int pageStart = (pageNo - 1) * pageSize;
        params.put("pageStart", pageStart);
        params.put("pageSize", pageSize);
        return this.findPage(params);
    }

    /**
     * 更新对象。
     * @return 返回更新的记录数
     */
    public int modify(E entity) {
        String updStatement = getMapperNamespace() + ".modify";

        if (entity instanceof BaseModel) {
            ((BaseModel) entity).setMtime(new Date());
            ((BaseModel) entity).setModifyBy(ContextUtil.getCurrentUserId());
        }
        int affectCount = getSqlSessionTemplate().update(updStatement, entity);
        return affectCount;
    }

    /**
     * 保存对象。
     * @return 返回插入记录数
     */
    public int save(E entity) {
        String updStatement = getMapperNamespace() + ".save";

        if (entity instanceof BaseModel) {
            ((BaseModel) entity).setCtime(new Date());
            ((BaseModel) entity).setMtime(new Date());
            ((BaseModel) entity).setCreateBy(ContextUtil.getCurrentUserId());
            ((BaseModel) entity).setModifyBy(ContextUtil.getCurrentUserId());
        }
        int affectCount = getSqlSessionTemplate().insert(updStatement, entity);
        return affectCount;
    }

    public int delete(PK primaryKey) {
        return getSqlSessionTemplate().delete(getMapperNamespace() + ".delete", primaryKey);
    }

}
